package org.acb.sgp.dao.impl;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.acb.sgp.beans.Locacion;
import org.acb.sgp.dao.LocacionDao;
import org.acb.sgp.factory.ConnectionFactory;

public class LocacionDaoImpl implements LocacionDao {

    private Connection con;
    private CallableStatement cs;
    private ResultSet rs;

    private Connection getConnection() throws SQLException {
        return ConnectionFactory.getInstance().getConnection();
    }

    @Override
    public void registrarLocacion(Locacion locacion) {
        try {
            String sql = "{Call RegistrarLocacion(?,?,?,?,?,?,?,?,?,?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setString(1, locacion.getNomLocacion());
            cs.setString(2, locacion.getStrDireccion());
            cs.setInt(3, locacion.getDistrito().getCodDistrito());
            cs.setInt(4, locacion.getCategoria().getCodCategoria());
            cs.setString(5, locacion.getNomContacto());
            cs.setString(6, locacion.getStrTelefono());
            cs.setDouble(7, locacion.getDblAlquiler());
            cs.setInt(8, locacion.getFlAlquiler());
            cs.setInt(9, locacion.getFlPermiso());
            if (locacion.getCodLocacion() == null) {
                cs.setInt(10, 0);
                cs.registerOutParameter(10, Types.INTEGER);
                cs.execute();
                locacion.setCodLocacion((Integer) cs.getObject(10));
            } else {
                cs.setInt(10, locacion.getCodLocacion());
                cs.execute();
            }
        } catch (SQLException ex) {
            System.out.println("ERROR EN LocacionDaoImpl>registrarLocacion: " + ex.toString());
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
    }

    @Override
    public void eliminarLocacion(Locacion locacion) {
    }

    @Override
    public Locacion buscarLocacionPorCodigo(Integer locacionId) {
        return null;
    }

    @Override
    public List<Locacion> buscarLocacionPorNombreCategoria(String nombre, Integer categoriaId) {
        List<Locacion> locaciones = new ArrayList<Locacion>();
        try {
            String sql = "{Call BuscarLocacionPorNombreCategoria(?,?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setString(1, nombre);
            cs.setInt(2, categoriaId);
            rs = cs.executeQuery();
            while (rs.next()) {
                locaciones.add(llenar(rs));
            }
        } catch (SQLException ex) {
            Logger.getLogger(LocacionDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return locaciones;
    }

    @Override
    public List<Locacion> listaLocaciones() {
        List<Locacion> locaciones = new ArrayList<Locacion>();
        try {
            String sql = "{Call ListarLocaciones()}";
            con = getConnection();
            cs = con.prepareCall(sql);
            rs = cs.executeQuery();
            while (rs.next()) {
                locaciones.add(llenar(rs));
            }
        } catch (SQLException ex) {
            Logger.getLogger(LocacionDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return locaciones;
    }

    private Locacion llenar(ResultSet rs) throws SQLException {
        Locacion locacion = new Locacion();
        locacion.setCodLocacion(rs.getInt("codLocacion"));
        locacion.setNomLocacion(rs.getString("nomLocacion"));
        locacion.setStrDireccion(rs.getString("strDireccion"));
        locacion.getDistrito().setCodDistrito(rs.getInt("codDistrito"));
        locacion.getDistrito().setNomDistrito(rs.getString("nomDistrito"));
        locacion.getCategoria().setCodCategoria(rs.getInt("codCategoria"));
        locacion.getCategoria().setNomCategoria(rs.getString("nomCategoria"));
        locacion.setNomContacto(rs.getString("nomContacto"));
        locacion.setStrTelefono(rs.getString("strTelefono"));
        locacion.setDblAlquiler(rs.getDouble("dblAlquiler"));
        locacion.setFlAlquiler(rs.getInt("flAlquiler"));
        locacion.setFlPermiso(rs.getInt("flPermiso"));
        return locacion;
    }

}
